﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM
{
    public partial class frmThongTinPhieuChi : Form
    {
        #region Attributes
        public clsPhieuChiTienDTO PhieuChi = null;
        string SoPhieuChi= string.Empty;
        string KyHieu = string.Empty;
        public Boolean IsThaoTac = false;
        #endregion

        #region Contruction
        public frmThongTinPhieuChi()
        {
            InitializeComponent();
        }

        public frmThongTinPhieuChi(string _SoPhieuChi, string _KyHieu)
        {
            InitializeComponent();
            SoPhieuChi = _SoPhieuChi;
            KyHieu = _KyHieu;
        }
        #endregion

        #region events
        private void frmThongTinPhieuChi_Load(object sender, EventArgs e)
        {
            try
            {
                gvPhieuChiChiTiet.AutoGenerateColumns=false;
                if (!string.IsNullOrEmpty(SoPhieuChi) && !string.IsNullOrEmpty(KyHieu))
                {
                    PhieuChi = new clsPhieuChiTienBUS().LayThongTinMotPhieuChi(SoPhieuChi, KyHieu);
                    if (PhieuChi != null)
                    {
                        txtSoPhieuChi.Text=PhieuChi.SoPhieuChi;
                        txtKyHieu.Text = PhieuChi.KyHieu;
                        txtMaKhachHang.Text=PhieuChi.MaDoiTac;
                        txtTenKhachHang.Text = PhieuChi.HoTen;
                        txtMaSoThue.Text=PhieuChi.MaSoThue;
                        txtDiaChiaXHD.Text=PhieuChi.DiaChi;
                        txtdNgayXuat.value=PhieuChi.NgayXuat;
                        txtThueVAT.Text=PhieuChi.PhanTramThue.ToString();
                        txtGhiChu.Text=PhieuChi.GhiChu;
                        clsNhanVienDTO NguoiXuat = new clsNhanVienBUS().LayThongTinMotNhanVien(PhieuChi.NguoiTaoId.ToString());
                        lblNguoiXuat.Text = NguoiXuat == null ? string.Empty : NguoiXuat.TenNhanVien;
                        lblNgayTao.Text = String.Format("{0:dd/MM/yyyy}", PhieuChi.NgayTao);

                        if (PhieuChi.NguoiChinhSuaId != null)
                        {
                            clsNhanVienDTO NguoiSua = new clsNhanVienBUS().LayThongTinMotNhanVien(PhieuChi.NguoiChinhSuaId.ToString());
                            lblNguoiChinhSua.Text = NguoiSua == null ? string.Empty : NguoiSua.TenNhanVien;
                        }
                        else
                        {
                            lblNguoiChinhSua.Text = string.Empty;
                        }
                        if (PhieuChi.NgayChinhSua != null)
                        {
                            lblNgayChinhSua.Text = String.Format("{0:dd/MM/yyyy}", PhieuChi.NgayChinhSua);
                        }
                        else
                        {
                            lblNgayChinhSua.Text = string.Empty;
                        }
                        gvPhieuChiChiTiet.DataSource=new clsPhieuChiTienBUS().LayBangPhieuChiChiet(PhieuChi.PhieuChiId);
                        lblTongTienChi.Text =clsSupport.CurrencyNumber(PhieuChi.TongTienChi.ToString());
                        lblSoTienChu.Text = hsTool.ConvertMoneyToText(PhieuChi.TongTienChi.ToString());
                    }
                    else
                    {
                        MessageBox.Show("Không lấy được thông tin phiếu chi với số phiếu chi: " + SoPhieuChi + " và ký hiệu: " + KyHieu, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        this.Close();
                    }
                }
            }
            catch (Exception) 
            { }
            SetPermission();
        }

        private void gvPhieuChiChiTiet_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    if (string.Equals(gvPhieuChiChiTiet.Columns[e.ColumnIndex].Name, "TienChi"))
                    {
                        TinhTongCongNo();
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                DialogResult result = MessageBox.Show("Bạn có thật sự muốn xóa phiếu chi không?", "Xác nhận thông tin", MessageBoxButtons.YesNo);
                if (result == DialogResult.Yes)
                {
                    if (PhieuChi != null)
                    {
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsPhieuChiTienBUS().Xoa(PhieuChi.PhieuChiId, ref Error))
                            {
                                CSQLServer.Commit();
                                IsThaoTac = true;
                                MessageBox.Show("Xóa phiếu chi với số " + PhieuChi.SoPhieuChi + " và ký hiệu " + PhieuChi.KyHieu + "  thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show("Xóa phiếu chi với số " + PhieuChi.SoPhieuChi + " và ký hiệu " + PhieuChi.KyHieu + " không thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Lưu phiếu chi không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Xóa phiếu chi không thành công do không lấy được thông tin phiếu chi!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            catch (Exception ex)
            { }
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                if (KiemTraKhoiTaoPhieuChi(ref Error, ref indexforcus))
                {

                    if (KhoiTaoPhieuChi(ref  Error))
                    {
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsPhieuChiTienBUS().Sua(PhieuChi, ref Error))
                            {
                                CSQLServer.Commit();
                                MessageBox.Show("Lưu phiếu chi thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                //LamTuoiManHinh();
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Lưu phiếu chi không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        MessageBox.Show("Lưu phiếu chi không thành công nguyên nhân do " + Error + "!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {

            }
        }

        // Hàm bắt sự kiện nhấn một phím trên Form. CTRL + ....
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            bool bKetQua = false;
            try
            {

                //------------------------------------
                if (keyData == Keys.Escape)
                {
                    this.Close();
                    bKetQua = true;
                }
                else if (keyData == (Keys.Control | Keys.S) && (btnLuu.Enabled))
                {
                    btnLuu_Click(null, null);
                }
                else if (keyData == (Keys.Control | Keys.D) && (btnXoa.Enabled))
                {
                    btnXoa_Click(null, null);
                }
                else
                    // bKetQua = base.ProcessCmdKey(ref msg, keyData);
                    bKetQua = false;
                return bKetQua;
            }
            catch (Exception) { }

            return bKetQua;
        }


        #endregion

        #region functions

        /// Khoi tao mot phieu thu
        /// </summary>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KhoiTaoPhieuChi(ref string Error)
        {
            try
            {
                PhieuChi.SoPhieuChi = txtSoPhieuChi.Text;
                PhieuChi.KyHieu = txtKyHieu.Text;
                PhieuChi.Ky = txtdNgayXuat.value.ToString("MM/yyyy");
                PhieuChi.NgayXuat = txtdNgayXuat.value;
                PhieuChi.MaDoiTac = txtMaKhachHang.Text;
                PhieuChi.HoTen = txtTenKhachHang.Text;
                PhieuChi.MaSoThue = txtMaSoThue.Text;
                PhieuChi.DiaChi = txtDiaChiaXHD.Text;
                PhieuChi.PhanTramThue = int.Parse(txtThueVAT.Text);
                PhieuChi.GhiChu = txtGhiChu.Text;
                PhieuChi.NguoiChinhSuaId = clsUser.NhanVienId;
                PhieuChi.NgayChinhSua = DateTime.Now;
                for (int i = 0; i < gvPhieuChiChiTiet.RowCount; i++)
                {
                    KhoiTaoPhieuChiChiTiet(i, PhieuChi.PhanTramThue);
                }

                PhieuChi.TongTienChi = 0;
                PhieuChi.TongTienHang = 0;
                PhieuChi.TongTienThue = 0;
                for (int k = 0; k < PhieuChi.CacPCCT.Count; k++)
                {
                    PhieuChi.TongTienChi += PhieuChi.CacPCCT[k].TienChi;
                    PhieuChi.TongTienHang += PhieuChi.CacPCCT[k].TienHang;
                    PhieuChi.TongTienThue += PhieuChi.CacPCCT[k].TienThue;
                }
            }
            catch (Exception)
            {
                Error = "Khởi tạo phiếu chi không thành công!";
                return false;
            }
            return true;
        }

        /// <summary>
        /// Khoi tao mot phieu thu chi tiet
        /// </summary>
        /// <param name="i"></param>
        /// <param name="ThueGTGT"></param>
        /// <returns></returns>
        private void KhoiTaoPhieuChiChiTiet(int i, int ThueGTGT)
        {
            for (int k = 0; k < PhieuChi.CacPCCT.Count; k++)
            {
                if (decimal.Parse(gvPhieuChiChiTiet.Rows[i].Cells["PhieuChiChiTietId"].Value.ToString()) == PhieuChi.CacPCCT[k].PhieuChiChiTietId)
                {
                    PhieuChi.CacPCCT[k].NoiDung = gvPhieuChiChiTiet.Rows[i].Cells["NoiDung"].Value.ToString();
                    PhieuChi.CacPCCT[k].TienChi = Double.Parse(gvPhieuChiChiTiet.Rows[i].Cells["TienChi"].Value.ToString());
                    PhieuChi.CacPCCT[k].TienThue = ThueGTGT > 0 ? Math.Round(PhieuChi.CacPCCT[i].TienChi / ThueGTGT, 0) : 0;
                    PhieuChi.CacPCCT[k].TienHang = PhieuChi.CacPCCT[k].TienChi - PhieuChi.CacPCCT[k].TienThue;
                    PhieuChi.CacPCCT[k].TaiKhoanNo = gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString();
                    PhieuChi.CacPCCT[k].TaiKhoanCo = gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString();
                    //PhieuChi.CacPCCT[k].TheId = gvPhieuChiChiTiet.Rows[i].Cells["TheThuId"].Value == null || string.IsNullOrEmpty(gvPhieuChiChiTiet.Rows[i].Cells["TheThuId"].Value.ToString()) ? null : (decimal?)decimal.Parse(gvPhieuChiChiTiet.Rows[i].Cells["TheThuId"].Value.ToString());
                }
            }
        }

        private bool KiemTraKhoiTaoPhieuChi(ref string strError, ref int indexforcus)
        {
            bool Flag = true;
            strError = "Lỗi phát sinh: ";

            #region Kiểm tra phiếu chi
            //Kiểm tra Tên đối tác 
            string TEN_TB = txtTenKhachHang.Text;
            if (TEN_TB.Trim() == "")
            {
                strError += "\n + Tên đối tác không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra Dia chi
            ////Kiểm tra Tên đối tác 
            //string DiaChiXHD = txtDiaChiaXHD.Text;
            //if (DiaChiXHD.Trim() == "")
            //{
            //    strError += "\n + Địa chỉ xuất phiếu chi không được bỏ trống!";
            //    indexforcus = 9;
            //        return false; 
            //}
            #endregion

            #region Kiểm tra định dạng số phiếu chi
            //Kiểm tra định dạng số phiếu chi
            string SO_PHIEU_THU = this.txtSoPhieuChi.Text.Trim().Replace(" ", "");
            int SoPhieuChi;
            if (!(SO_PHIEU_THU.Trim() != "" && (SO_PHIEU_THU.Length == 6 || SO_PHIEU_THU.Length == 7) && int.TryParse(SO_PHIEU_THU, out SoPhieuChi)))
            {
                strError += "\n + Số phiếu chi theo định dạng: Số phiếu chi là số gồm 6 hoặc 7 chữ số ví dụ: 000001, 101111, 1234567 ...";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra ký hiệu phiếu chi (Đã được kiểm tra trên control)
            //Kiểm tra ký hiệu phiếu chi (Đã được kiểm tra trên control)
            string KY_HIEU_HD = this.txtKyHieu.Text;
            if (KY_HIEU_HD == null || KY_HIEU_HD.Trim() == "")
            {
                strError += "\n + Ký hiệu phiếu chi không được bỏ trống!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            //Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            int THUE_SUAT;
            if (!int.TryParse(this.txtThueVAT.Text, out THUE_SUAT))
            {
                strError += "\n + Thuế GTGT là một số thực dương: 20%, 10%...";
                indexforcus = 9;
                return false;
            }
            else
            {
                if (!(THUE_SUAT >= 0 && THUE_SUAT <= 100))
                {
                    strError += "\n + Thuế GTGT phải 0% <= Thuế GTGT <= 100% ";
                    indexforcus = 9;
                    return false;
                }
            }
            #endregion

            #region Kiểm tra ID nhân viên
            //Kiểm tra ID nhân viên tiền chi
            int MaNguoiDung;
            if (!int.TryParse(clsUser.NhanVienId.ToString(), out MaNguoiDung) && Flag)
            {
                strError += "\n + Không lấy được thông tin người dùng đã đăng nhập!";
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra lưới tiền chi
            //Kiểm tra lưới tiền chi
            CMS_DinhKhoan DinhKhoan = new CMS_DinhKhoan();
            List<DINH_KHOAN_NO> DinhKhoanNo = DinhKhoan.GetListDinhKhoanNoCoHieuLuc();
            List<DINH_KHOAN_CO> DinhKhoanCo = DinhKhoan.GetListDinhKhoanCoChiPhiCoHieuLuc();
            if (!KiemTraLuoiThuTien(DinhKhoanNo, DinhKhoanCo, ref strError))
            {
                indexforcus = 9;
                return false;
            }
            #endregion

            #region Kiểm tra sua ky hieu phieu chi
            string KyHieu = txtKyHieu.Text;
            if (KyHieu.Trim() != PhieuChi.KyHieu.Trim())
            {
                if (new clsPhieuChiTienBUS().KiemTraTonTai(txtSoPhieuChi.Text, KyHieu))
                {
                    strError += "\n + Số phiếu chi và ký hiệu vừa chỉnh sửa đã tồn tại trong hệ thống!";
                    indexforcus = 9;
                    return false;
                }
            }
            #endregion

            return true;
        }

        /// <summary>
        /// Kiểm tra lưới tiền chi
        /// </summary>
        /// <param name="ThueGTGT"></param>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KiemTraLuoiThuTien(List<DINH_KHOAN_NO> DinhKhoanNo, List<DINH_KHOAN_CO> DinhKhoanCo, ref string Error)
        {
            int Count = 0;
            try
            {
                for (int i = 0; i < gvPhieuChiChiTiet.RowCount; i++)
                {
                    Count++;
                    Decimal TienChi;
                    int TaiKhoanNo;
                    int TaiKhoanCo;
                    if (gvPhieuChiChiTiet.Rows[i].Cells["NoiDung"].Value == null || string.IsNullOrEmpty(gvPhieuChiChiTiet.Rows[i].Cells["NoiDung"].Value.ToString()))
                    {
                        Error = "Ô 'Nội dung' tiền chi không được bỏ trống ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    if (gvPhieuChiChiTiet.Rows[i].Cells["TienChi"].Value == null || !Decimal.TryParse(gvPhieuChiChiTiet.Rows[i].Cells["TienChi"].Value.ToString(), out TienChi) || TienChi <= 0)
                    {
                        Error = "Ô 'Tiền chi' phải nhập là số nguyên dương ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    if (gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || !int.TryParse(gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString(), out TaiKhoanNo))
                    {
                        Error = "Ô 'TK Nợ' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    else
                    {
                        if (!KiemTraDinhKhoanNo(DinhKhoanNo, TaiKhoanNo))
                        {
                            Error = "Ô 'TK Nợ' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản nợ!";
                            return false;
                        }
                    }
                    if (gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || !int.TryParse(gvPhieuChiChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString(), out TaiKhoanCo))
                    {
                        Error = "Ô 'TK Có' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                        return false;
                    }
                    else
                    {
                        if (!KiemTraDinhKhoanCo(DinhKhoanCo, TaiKhoanCo))
                        {
                            Error = "Ô 'TK Có' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản tiền chi!";
                            return false;
                        }
                    }
                }
                if (Count == 0)
                {
                    Error = "Nhập Thông tin chi tiết phiếu chi không được bỏ trống!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Error = "Khởi tạo phiếu chi không thành công! xin vui lòng kiểm tra lại \r\n" + ex.Message;
                return false;
            }

        }

        private bool KiemTraDinhKhoanNo(List<DINH_KHOAN_NO> DinhKhoanNo, int TaiKhoanNo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanNo.Count; i++)
                {
                    if (DinhKhoanNo[i].TAI_KHOAN_NO == TaiKhoanNo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private bool KiemTraDinhKhoanCo(List<DINH_KHOAN_CO> DinhKhoanCo, int TaiKhoanCo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanCo.Count; i++)
                {
                    if (DinhKhoanCo[i].TAI_KHOAN_CO == TaiKhoanCo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private void TinhTongCongNo()
        {
            try
            {
                double TongTienChi = 0;
                for (int i = 0; i < gvPhieuChiChiTiet.RowCount; i++)
                {
                    double TienChi;
                    if (double.TryParse((gvPhieuChiChiTiet.Rows[i].Cells["TienChi"].Value == null ? "0" : gvPhieuChiChiTiet.Rows[i].Cells["TienChi"].Value.ToString()), out TienChi))
                    {
                        TongTienChi += TienChi;
                    }
                }

                lblTongTienChi.Text = clsSupport.CurrencyNumber(TongTienChi.ToString());
                lblSoTienChu.Text = hsTool.ConvertMoneyToText(TongTienChi.ToString());
            }
            catch (Exception ex)
            { }

        }

        private void SetPermission()
        {
            btnLuu.Enabled = clsUser.LayThongTinPhanQuyen("PhieuChi").ChucNang.Sua;
            btnXoa.Enabled = clsUser.LayThongTinPhanQuyen("PhieuChi").ChucNang.Xoa;
        }

        #endregion
    }
}
